#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""手动修复 alembic_version 表的辅助脚本

使用场景：
    某次迁移文件被误删 / 文件空内容 / 修订链断裂，导致 flask db upgrade 引用不存在的 revision。
    在数据库仍保留旧的 version_num 时，可用该脚本直接修改为指定合法 revision，然后再执行普通升级。

安全注意：
    - 仅在确认数据库是测试库或无生产风险时使用。
    - 若为生产，请先备份数据库，再执行。

用法：
    python scripts/fix_alembic_version.py <target_revision>
    例: python scripts/fix_alembic_version.py ec078df35d89

逻辑：
    1. 读取当前 version_num
    2. 若与目标不同 -> update alembic_version set version_num=:target
    3. 输出 diff
    4. 不执行后续 upgrade，需手动再跑 flask db upgrade

"""
import os
import sys
from sqlalchemy import create_engine, text

if len(sys.argv) != 2:
    print("[USAGE] python scripts/fix_alembic_version.py <target_revision>")
    sys.exit(1)

target = sys.argv[1].strip()

DB_URI = os.getenv('DATABASE_URL') or os.getenv('SQLALCHEMY_DATABASE_URI')
if not DB_URI:
    # 回退尝试：从 Flask app 读
    try:
        from backend import create_app  # type: ignore
        app = create_app()
        DB_URI = app.config.get('SQLALCHEMY_DATABASE_URI')
    except Exception as e:
        print(f"[FATAL] 无法确定数据库URI: {e}")
        sys.exit(2)

engine = create_engine(DB_URI)

with engine.connect() as conn:
    try:
        row = conn.execute(text('SELECT version_num FROM alembic_version')).fetchone()
        if not row:
            print('[INFO] alembic_version 为空，直接插入新的版本记录')
            conn.execute(text('INSERT INTO alembic_version (version_num) VALUES (:v)'), {'v': target})
            print(f'[DONE] 已插入 version_num={target}')
        else:
            current = row[0]
            if current == target:
                print(f'[OK] 当前版本已是 {current}，无需修改')
            else:
                print(f'[INFO] 当前版本: {current} -> 目标: {target}')
                conn.execute(text('UPDATE alembic_version SET version_num=:v'), {'v': target})
                print('[DONE] 已更新 alembic_version 表')
    except Exception as e:
        print(f'[ERROR] 操作失败: {e}')
        sys.exit(3)

print('下一步: 执行 flask db upgrade 以补齐后续迁移 (若有)')
